package com.tianji.promotion.task;

import com.tianji.common.utils.DateUtils;
import com.tianji.common.utils.ObjectUtils;
import com.tianji.promotion.domain.po.Coupon;
import com.tianji.promotion.enums.CouponStatus;
import com.tianji.promotion.service.ICouponService;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 持久化历史积分排行榜数据定时任务
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class CouponStatusTask {
    private final ICouponService couponService;

    /**
     * 定时扫描优惠券发放时间，修改发放状态
     */
    @XxlJob("couponIssueJobHandler")
    public void couponIssueJobHandler() {
        //1、从所有优惠券状态处于未开始的UN_ISSUE，并且发放时间早于当前时间的
        List<Coupon> list = couponService.lambdaQuery()
                .eq(Coupon::getStatus, CouponStatus.UN_ISSUE)
                .le(Coupon::getIssueBeginTime, DateUtils.now())
                .list();
        if (ObjectUtils.isEmpty(list)) {
            return;
        }
        //2、流处理获取id集合
        List<Long> ids = list.stream().map(Coupon::getId).collect(Collectors.toList());
        //3、批量将对应优惠券状态改为发放中
        couponService.lambdaUpdate()
                .in(Coupon::getId, ids)
                .set(Coupon::getStatus, CouponStatus.ISSUING)
                .update();
    }


    /**
     * 定时扫描优惠券发放结束时间，修改发放状态
     */
    @XxlJob("couponIssueEndJobHandler")
    public void couponIssueEndJobHandler() {
        //1、从所有优惠券状态处于进行中或暂停中的ISSUING、PAUSE，并且发放结束时间早于当前时间的
        List<Coupon> list = couponService.lambdaQuery()
                .in(Coupon::getStatus, CouponStatus.ISSUING, CouponStatus.PAUSE)
                .le(Coupon::getIssueEndTime, DateUtils.now())
                .list();
        if (ObjectUtils.isEmpty(list)) {
            return;
        }
        //2、流处理获取id集合
        List<Long> ids = list.stream().map(Coupon::getId).collect(Collectors.toList());
        //3、批量将对应优惠券状态改为发放中
        couponService.lambdaUpdate()
                .in(Coupon::getId, ids)
                .set(Coupon::getStatus, CouponStatus.FINISHED)
                .update();
    }
}
